module ecs {
    /**
     * SceneTransition用于从一个场景过渡到另一个场景或具有效果的场景内。 
     * 如果sceneLoadAction为null，则将执行场景内过渡，而不是加载新的场景中间过渡。
     * 
     * 过渡的基本要点如下：
     * -onBeginTransition将被调用，从而允许您产生多部分过渡
     * -对于使用效果的两部分过渡，您可以在调用tickEffectProgressProperty时产生效果，以使第一部分遮盖屏幕
     * -接下来，发出对loadNextScene的调用以加载新场景
     * -最后，再次在tickEffectProgressProperty上屈服以使屏幕不模糊并显示新场景
     */
    export abstract class SceneTransiton{
        /**
         * 在执行loadNextScene时调用。 
         * 这在进行场景间过渡时非常有用，这样您就可以知道何时可以添加更多Camera或重置任何实体
         */
        public OnScreenObscured: Function;

        /**
         * 指示此过渡是否将加载新场景的标志
         */
        public _loadsNewScene: boolean;

        /**
         * 使用它进行两部分过渡。 例如，淡入淡出首先会淡化为黑色，然后当_isNewSceneLoaded变为true时它将淡入。
         * 对于场景内过渡，_isNewSceneLoaded应该在中点设置为true，就像加载新场景一样。
         */
        public _isNewSceneLoaded;

        /**
         * 应该返回新加载场景的函数
         */
        protected sceneLoadAction: Function;

        public async OnBeginTranstion(){
            this.LoadNextScene();
        }

        protected LoadNextScene(){
            if (this.OnScreenObscured){
                this.OnScreenObscured();
            }

            if (!this._loadsNewScene){
                this._isNewSceneLoaded = true;
            }

            var scene = this.sceneLoadAction();
            Core.Scene = scene;
            this._isNewSceneLoaded = true;
        }

    }
}